# -*- coding: utf-8 -*-
"""
应用启动器插件
管理和启动外部应用程序
"""

import sys
import os
import json
import subprocess
from pathlib import Path

# 添加父目录到路径，以便导入core模块
sys.path.append(os.path.dirname(os.path.dirname(__file__)))

from core.plugin_manager import BasePlugin


class AppLauncherPlugin(BasePlugin):
    """应用启动器插件"""
    
    def __init__(self):
        super().__init__()
        self.name = "app"
        self.version = "1.0.0"
        self.description = "管理和启动外部应用程序"
        self.apps_file = "apps.json"
        self.apps = self.load_apps()
        
    def execute(self, args):
        """执行应用启动器功能"""
        if not args:
            self.show_help()
            return True
            
        command = args[0].lower()
        
        if command == 'add':
            if len(args) < 2:
                print("请提供应用程序路径")
                print("用法: app add <路径> [别名]")
                print("提示: 可以直接拖拽exe文件到命令行")
                print("提示: 路径包含空格时请用引号包围，如: app add \"C:\\Program Files\\app.exe\"")
                return True
            # 重新组合路径参数
            self.add_app_with_path_reconstruction(args[1:])
        elif command == 'list':
            self.list_apps()
        elif command == 'run' or command == 'start':
            if len(args) < 2:
                print("请指定要启动的应用")
                print("用法: app run <别名或序号>")
                return True
            self.run_app(args[1])
        elif command == 'remove' or command == 'del':
            if len(args) < 2:
                print("请指定要删除的应用")
                print("用法: app remove <别名或序号>")
                return True
            self.remove_app(args[1])
        elif command == 'help':
            self.show_help()
        else:
            # 直接输入路径的情况（拖拽文件）
            # 尝试重新组合路径
            reconstructed_path = self.reconstruct_path(args)
            if reconstructed_path and os.path.exists(reconstructed_path):
                self.add_app([reconstructed_path])
            else:
                # 尝试作为应用名启动
                self.run_app(args[0])
            
        return True
    
    def reconstruct_path(self, args):
        """重新构建可能被空格分割的路径"""
        if not args:
            return None
        
        # 处理引号包围的路径
        first_arg = args[0]
        if first_arg.startswith('"') and first_arg.endswith('"'):
            # 移除引号
            clean_path = first_arg[1:-1]
            if os.path.exists(clean_path):
                return clean_path
        
        # 如果第一个参数已经是完整路径，直接返回
        if os.path.exists(first_arg):
            return first_arg
        
        # 尝试重新组合路径
        for i in range(1, len(args) + 1):
            potential_path = ' '.join(args[:i])
            # 也检查去除引号的版本
            clean_potential_path = potential_path.strip('"')
            if os.path.exists(potential_path):
                return potential_path
            elif os.path.exists(clean_potential_path):
                return clean_potential_path
        
        return None
    
    def add_app_with_path_reconstruction(self, args):
        """添加应用，支持路径重构"""
        if not args:
            return
            
        # 尝试重新构建路径
        reconstructed_path = self.reconstruct_path(args)
        
        if reconstructed_path:
            # 找到有效路径，计算别名参数的位置
            path_parts = len(reconstructed_path.split())
            if len(args) > path_parts:
                # 有别名参数
                alias_parts = args[path_parts:]
                alias = ' '.join(alias_parts) if alias_parts else None
                self.add_app([reconstructed_path, alias] if alias else [reconstructed_path])
            else:
                # 没有别名参数
                self.add_app([reconstructed_path])
        else:
            # 无法重构路径，尝试原始逻辑
            print(f"无法找到有效路径，尝试的路径: {' '.join(args)}")
            print("请检查路径是否正确，或使用引号包围路径")
            print("示例: app add \"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\" chrome")
    
    def load_apps(self):
        """加载应用列表"""
        try:
            if os.path.exists(self.apps_file):
                with open(self.apps_file, 'r', encoding='utf-8') as f:
                    return json.load(f)
        except Exception as e:
            print(f"加载应用列表失败: {e}")
        return {}
    
    def save_apps(self):
        """保存应用列表"""
        try:
            with open(self.apps_file, 'w', encoding='utf-8') as f:
                json.dump(self.apps, f, ensure_ascii=False, indent=2)
            return True
        except Exception as e:
            print(f"保存应用列表失败: {e}")
            return False
    
    def add_app(self, args):
        """添加应用程序"""
        app_path = args[0].strip('"\'')  # 移除可能的引号
        
        # 验证路径
        if not os.path.exists(app_path):
            print(f"错误: 文件不存在 - {app_path}")
            return
        
        if not app_path.lower().endswith('.exe'):
            print("警告: 文件不是exe格式，但仍会添加")
        
        # 生成别名
        if len(args) > 1:
            alias = args[1]
        else:
            # 使用文件名作为默认别名
            alias = Path(app_path).stem.lower()
        
        # 检查别名是否已存在
        if alias in self.apps:
            print(f"别名 '{alias}' 已存在，是否覆盖？(y/n): ", end="")
            try:
                choice = input().lower()
                if choice != 'y' and choice != 'yes':
                    print("取消添加")
                    return
            except:
                print("取消添加")
                return
        
        # 添加应用
        self.apps[alias] = {
            'path': os.path.abspath(app_path),
            'name': Path(app_path).stem,
            'added_time': self.get_current_time()
        }
        
        if self.save_apps():
            print(f"✓ 应用已添加: {alias}")
            print(f"  路径: {self.apps[alias]['path']}")
            print(f"  启动命令: app run {alias}")
        else:
            print("添加失败")
    
    def list_apps(self):
        """列出所有应用"""
        if not self.apps:
            print("暂无已添加的应用程序")
            print("使用 'app add <路径>' 添加应用")
            return
        
        print("\n=== 已添加的应用程序 ===")
        for i, (alias, info) in enumerate(self.apps.items(), 1):
            status = "✓" if os.path.exists(info['path']) else "✗"
            print(f"{i:2d}. {status} {alias}")
            print(f"     名称: {info['name']}")
            print(f"     路径: {info['path']}")
            print(f"     添加时间: {info.get('added_time', '未知')}")
            print()
        
        print("使用方法:")
        print("  app run <别名>     - 启动应用")
        print("  app run <序号>     - 启动应用")
        print("  app remove <别名>  - 删除应用")
    
    def run_app(self, identifier):
        """启动应用程序"""
        app_info = None
        
        # 尝试按别名查找
        if identifier in self.apps:
            app_info = self.apps[identifier]
            alias = identifier
        else:
            # 尝试按序号查找
            try:
                index = int(identifier) - 1
                if 0 <= index < len(self.apps):
                    alias = list(self.apps.keys())[index]
                    app_info = self.apps[alias]
            except ValueError:
                pass
        
        if not app_info:
            print(f"未找到应用: {identifier}")
            print("使用 'app list' 查看所有应用")
            return
        
        app_path = app_info['path']
        
        # 检查文件是否存在
        if not os.path.exists(app_path):
            print(f"错误: 应用文件不存在 - {app_path}")
            print(f"是否删除此应用记录？(y/n): ", end="")
            try:
                choice = input().lower()
                if choice == 'y' or choice == 'yes':
                    del self.apps[alias]
                    self.save_apps()
                    print("已删除无效的应用记录")
            except:
                pass
            return
        
        try:
            print(f"正在启动: {app_info['name']}")
            print(f"路径: {app_path}")
            
            # 启动应用程序
            if os.name == 'nt':  # Windows
                subprocess.Popen([app_path], shell=True)
            else:  # Linux/Mac
                subprocess.Popen([app_path])
            
            print("✓ 应用启动成功")
            
        except Exception as e:
            print(f"启动失败: {e}")
    
    def remove_app(self, identifier):
        """删除应用程序"""
        alias = None
        
        # 尝试按别名查找
        if identifier in self.apps:
            alias = identifier
        else:
            # 尝试按序号查找
            try:
                index = int(identifier) - 1
                if 0 <= index < len(self.apps):
                    alias = list(self.apps.keys())[index]
            except ValueError:
                pass
        
        if not alias:
            print(f"未找到应用: {identifier}")
            return
        
        app_info = self.apps[alias]
        print(f"确认删除应用 '{alias}' ({app_info['name']})？(y/n): ", end="")
        try:
            choice = input().lower()
            if choice == 'y' or choice == 'yes':
                del self.apps[alias]
                if self.save_apps():
                    print("✓ 应用已删除")
                else:
                    print("删除失败")
            else:
                print("取消删除")
        except:
            print("取消删除")
    
    def get_current_time(self):
        """获取当前时间字符串"""
        from datetime import datetime
        return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    
    def show_help(self):
        """显示帮助信息"""
        print("\n=== 应用启动器使用说明 ===")
        print("用法: app <命令> [参数]")
        print("\n可用命令:")
        print("  add <路径> [别名]  - 添加应用程序")
        print("  list              - 列出所有应用")
        print("  run <别名|序号>    - 启动应用")
        print("  remove <别名|序号> - 删除应用")
        print("  help              - 显示此帮助")
        print("\n使用技巧:")
        print("  • 直接拖拽exe文件到命令行自动添加")
        print("  • 可以使用别名或序号来操作应用")
        print("  • 支持自动检测无效路径")
        print("\n示例:")
        print("  app add C:\\Program Files\\Notepad++\\notepad++.exe notepad")
        print("  app add \"D:\\软件\\QQ\\QQ.exe\" qq")
        print("  app run notepad")
        print("  app run 1")
        print("  app list")
        print("  app remove qq")
        print("\n快捷方式:")
        print("  app <路径>        - 直接添加应用（拖拽文件）")
        print("  app <别名>        - 直接启动应用")
        
    def get_help(self):
        """获取插件帮助信息"""
        return f"{self.name}: {self.description}\n  用法: app <add|list|run|remove|help> [参数]"